package com.zm.zb100.test;

import rx.Observable;
import rx.schedulers.Schedulers;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * ZipDemo
 *
 * <p>
 * </p>
 *
 * @author chuanbai
 * @date 2024/4/1
 */
public class ZipDemo {

    public static void main(String[] args) {
        // 模拟三个 Observable，每个 Observable 发射一个 Map<Long, String> 对象
        Observable<Map<Long, String>> observable1 = simulateNetworkCall(1)
                .map(ZipDemo::generateMap);
        Observable<Map<Long, String>> observable2 = simulateNetworkCall(2)
                .map(ZipDemo::generateMap);
        Observable<Map<Long, String>> observable3 = simulateNetworkCall(3)
                .map(ZipDemo::generateMap);

        // 使用 zip 方法将三个 Observable 的结果进行组合
        Observable.zip(
                        observable1,
                        observable2,
                        observable3,
                        (map1, map2, map3) -> {
                            // 在这里可以对三个结果进行处理，这里只是简单地将它们放入一个 List 中返回
                            Map<String, Map<Long, String>> resultMap = new HashMap<>();
                            resultMap.put("Map1", map1);
                            resultMap.put("Map2", map2);
                            resultMap.put("Map3", map3);
                            return resultMap;
                        })
                .subscribe(resultMap -> {
                    // 处理组合后的结果
                    System.out.println("Combined Result: " + resultMap);
                });
    }

    // 模拟网络请求
    private static Observable<String> simulateNetworkCall(int observableNumber) {
        return Observable.just("Result from Observable " + observableNumber)
                .delay(observableNumber, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io());
    }

    // 生成一个简单的 Map<Long, String> 对象
    private static Map<Long, String> generateMap(String result) {
        Map<Long, String> map = new HashMap<>();
        map.put(1L, result);
        return map;
    }
}
